Adding ICPC Live Archive
[andmenj-acm.git] / ICPC Live Archive / 3928 - Ballroom lights / help / gomox.ar-pap-2010-d9b17e5cb110 / tpd / doc / gnu.tex
blob0f9bfc78921d5d711980a30bed37785512d3ec56
1 \section{10625 - GNU's Not Unix}
2 \textbf{Problema:}
3 Se tiene un conjunto de reglas que determinan c\'omo se debe expandir una letra en
4 un acr\'onimo potencialmente recursivo. Para cada conjunto de reglas se quieren
5 responder varias consultas. Cada consulta consiste en lo siguiente: dada una
6 cadena $s$, un caracter $c$ y un natural $k$, se quiere saber cu\'antas ocurrencias
7 de $c$ hay en la cadena que resulta de expandir $k$ veces el acr\'onimos $s$.
9 \subsection{Resoluci\'on}
11 Se trabaja con cadenas de un alfabeto $\Sigma$.
12 Sea $\#_c(s) = \text{cantidad de ocurrencias de $c$ en $s$}$.
13 El problema se modela mediante una funci\'on
14 $f : \Sigma \rightarrow \Sigma^*$ que expande las siglas, definiendo $f(x) = x$ si $x$
15 es un caracter no expandible. Se considera la extensi\'on $\hat{f} : \Sigma^* \rightarrow \Sigma^*$,
16 definida por: $\hat{f}(a_1 \hdots a_n) = f(a_1) \hdots f(a_n)$.
17 Se desea conocer $\#_c(\hat{f}^k(s))$.
19 Sea $A = |\Sigma|$ el tama\~no del alfabeto.
20 Se define $g : \Nat^A \rightarrow \Nat^A$
21 como: $g(k_1, ..., k_A)[i] = \sum_{j = 1}^{A}{k_j \cdot \#_{chr(i)}(f(chr(j)))}$.
23 Afirmaci\'on: $g(\#_{chr(1)}(s), \hdots, \#_{chr(A)}(s))[i] = \#_{chr(i)}\hat{f}(s)$.
24 Es decir, dado un vector con la cantidad de ocurrencias de cada caracter,
25 $g$ devuelve un vector con la cantidad de ocurrencias de cada caracter
26 despu\'es de expandir una vez los acr\'onimos.
28 Demostraci\'on:
29 $g(\#_{chr(1)}(s), \hdots, \#_{chr(A)}(s))[i] =
30 \sum_{j=1}^{A}{\#_{chr(j)}(s) \cdot \#_{chr(i)}{f(chr(j))}} =
31 \sum_{t=1}^{n}{\#_{chr(i)}{f(s_t)}} =\\
32 = \#_{chr(i)}{(f(s_1) \hdots f(s_n))} = \#_{chr(i)}{\hat{f}(s)}$. $\Box$
34 Entonces, es f\'acil ver que $\#_{chr(i)}{\hat{f}^k(s)} = g^k(\#_{chr(1)}(s), \hdots, \#_{chr(A)}(s))[i]$.
35 Adem\'as, $g$ es una transformaci\'on lineal, representable con una matriz, $M \in \Nat^{A\times A}$:
36 si se define $M_{i,j} := \#_{chr(i)}{f(chr(j))}$ y $b = \langle k_1 \hdots k_n \rangle^t$,
37 entonces $(M \cdot b)_{i}
38 = \sum_{j=1}^{A}{M_{i,j} \cdot k_j}
39 = k_j \cdot \#_{chr(i)}{f(chr(j))} = g(k_1, ..., k_A)[i]$.
40 Por lo tanto, el problema se reduce a elevar la matriz $M$ a la $k$
41 y finalmente multiplicar por el vector $b$, que cuenta la cantidad de
42 ocurrencias de cada caracter en $s$.
44 En cuanto a la complejidad,
45 suponer que la entrada consta de $Q$ consultas.
46 La matriz $M$ es fija porque depende s\'olo de $f$, es decir de las reglas
47 para expandir los acr\'onimos.
48 Para la $i$-\'esima consulta, se calcula $M^{k_i} b_i$,
49 donde $k_i$ es la potencia de la $i$-\'esima consulta y
50 $b_i$ el vector de ocurrencias asociado a la cadena
51 de dicha consulta.
53 Leer las reglas y cada una de las consultas tiene costo lineal en el tama\~no de la entrada.
54 Primero se construye la matriz $M$, de tama\~no $A^2$. Para cada consulta,
55 se construye el vector $b_i$, de tama\~no $O(A)$.
56 Para elevar la matriz $M$ a la $k_i$ se usa el m\'etodo de potencia binaria
57 que requiere $O(\log k_i)$ multiplicaciones de matrices. El producto de
58 matrices se implementa de la manera directa, lo cual tiene una
59 complejidad temporal de $O(A^3)$. El producto final entre $M^{k_i}$ y $b_i$
60 tiene costo $O(A^2)$.
62 Si el tama\~no total de la entrada es $E$, la complejidad temporal
63 en peor caso es $O(E + A^2 + \sum_{i=1}^{Q} \log(k_i) A^3)$.
64 Tomando $K = \max_{i=1}^{Q}{k_i}$, esto se puede acotar por:
65 $O(E + A^2 + Q \log(K) A^3)$.
66 Adem\'as, por las restricciones dadas en el enunciado sobre los
67 tama\~nos de las cadenas en la entrada, $E << A^3$, y por lo tanto
68 la complejidad es $O(Q \log(K) A^3)$.
70 La complejidad espacial es $O(A^2)$. El algoritmo de multiplicaci\'on
71 de matrices y de potencia binaria usan matrices auxiliares de tama\~no
72 $A^2$, pero siempre una cantidad constante.
74 \subsubsection{Alternativa no implementada}
76 Dado que $Q \leq 10$, la complejidad temporal de $O(Q \log(K) A^3)$
77 es razonable y hace que la implementaci\'on sea aceptada por el
78 {\em online judge}. Si $Q$ fuera potencialmente muy grande,
79 en lugar de calcular $M^{k_i}$ usando el m\'etodo de potenciaci\'on
80 binaria para cada una de las consultas separadamente, se podr\'ian calcular
81 y guardar una sola vez las matrices: $M^1, M^2, M^4, ..., M^{2^p}$
82 (mientras $2^p < K$). Una vez hecho esto, para responder una consulta,
83 bastar\'ia con sumar las matrices que corresponden a potencias de $2$
84 que intervienen en la representaci\'on binaria de $k_i$. Dado que
85 sumar las matrices tiene costo $O(A^2)$, y que la multiplicaci\'on
86 final por el vector $b_i$ tambi\'en es $O(A^2)$, la complejidad temporal
87 de cada consulta ser\'ia $O(\log(k_i) A^2)$. La complejidad temporal
88 de responder todas las consultas ser\'ia $O(\log(K) A^3 + Q \log(K) A^2)$.
89 Por otro lado, la complejidad espacial aumentar\'ia a
90 $O(\log(K) A^2)$ porque ser\'ia necesario guardar las potencias
91 ya mencionadas de $M$.
93 \subsection{Implementación}
95 \noindent
96 \ttfamily
97 \shorthandoff{"}\\
98 \hlstd{}\hlline{\ 1\ }\hldir{\#include\ $<$vector$>$}\\
99 \hlline{\ 2\ }\hlstd{}\hldir{\#include\ $<$cstdio$>$}\\
100 \hlline{\ 3\ }\hlstd{}\hldir{\#include\ $<$iostream$>$}\\
101 \hlline{\ 4\ }\hlstd{}\hldir{\#include\ $<$cassert$>$}\\
102 \hlline{\ 5\ }\hlstd{}\hldir{\#include\ $<$cstring$>$}\\
103 \hlline{\ 6\ }\hlstd{}\\
104 \hlline{\ 7\ }\hlkwa{using\ namespace\ }\hlstd{std}\hlsym{;}\\
105 \hlline{\ 8\ }\hlstd{}\\
106 \hlline{\ 9\ }\hlkwc{typedef\ }\hlstd{}\hlkwb{unsigned\ long\ long\ int\ }\hlstd{lluint}\hlsym{;}\\
107 \hlline{10\ }\hlstd{}\\
108 \hlline{11\ }\hlkwc{typedef\ }\hlstd{vector}\hlsym{$<$}\hlstd{lluint}\hlsym{$>$\ }\hlstd{Row}\hlsym{;}\\
109 \hlline{12\ }\hlstd{}\hlkwc{typedef\ }\hlstd{vector}\hlsym{$<$}\hlstd{Row}\hlsym{$>$\ }\hlstd{Mat}\hlsym{;}\\
110 \hlline{13\ }\hlstd{}\\
111 \hlline{14\ }\hldir{\#define\ forsn(i,\ s,\ n)\ for\ (int\ i\ =\ (s);\ i\ $<$\ (n);\ i++)}\\
112 \hlline{15\ }\hlstd{}\hldir{\#define\ forn(i,\ n)\ forsn\ (i,\ 0,\ n)}\\
113 \hlline{16\ }\hlstd{}\\
114 \hlline{17\ }\hlkwb{void\ }\hlstd{}\hlkwd{mat\textunderscore mult}\hlstd{}\hlsym{(}\hlstd{}\hlkwb{const\ }\hlstd{Mat}\hlsym{\&\ }\hlstd{m1}\hlsym{,\ }\hlstd{}\hlkwb{const\ }\hlstd{Mat}\hlsym{\&\ }\hlstd{m2}\hlsym{,\ }\hlstd{Mat}\hlsym{\&\ }\hlstd{res}\hlsym{)\ \{}\\
115 \hlline{18\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwb{const\ int\ }\hlstd{n\ }\hlsym{=\ }\hlstd{m1}\hlsym{.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{();}\\
116 \hlline{19\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwb{const\ int\ }\hlstd{m\ }\hlsym{=\ }\hlstd{m2}\hlsym{.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{();}\\
117 \hlline{20\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwb{const\ int\ }\hlstd{p\ }\hlsym{=\ }\hlstd{m2}\hlsym{{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{();}\\
118 \hlline{21\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwd{assert}\hlstd{}\hlsym{(}\hlstd{m1}\hlsym{{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{()\ ==\ }\hlstd{m\ }\hlsym{\&\&\ }\hlstd{res}\hlsym{.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{()\ ==\ }\hlstd{n\ }\hlsym{\&\&\ }\hlstd{res}\hlsym{{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{()\ ==\ }\hlstd{p}\hlsym{);}\\
119 \hlline{22\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{i}\hlsym{,\ }\hlstd{n}\hlsym{)\ }\hlstd{}\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{j}\hlsym{,\ }\hlstd{p}\hlsym{)\ \{}\\
120 \hlline{23\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{lluint\ s\ }\hlsym{=\ }\hlstd{}\hlnum{0}\hlstd{}\hlsym{;}\\
121 \hlline{24\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{k}\hlsym{,\ }\hlstd{m}\hlsym{)\ }\hlstd{s\ }\hlsym{+=\ }\hlstd{m1}\hlsym{{[}}\hlstd{i}\hlsym{{]}{[}}\hlstd{k}\hlsym{{]}\ {*}\ }\hlstd{m2}\hlsym{{[}}\hlstd{k}\hlsym{{]}{[}}\hlstd{j}\hlsym{{]};}\\
122 \hlline{25\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{res}\hlsym{{[}}\hlstd{i}\hlsym{{]}{[}}\hlstd{j}\hlsym{{]}\ =\ }\hlstd{s}\hlsym{;}\\
123 \hlline{26\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlsym{\}}\\
124 \hlline{27\ }\hlstd{}\hlsym{\}}\\
125 \hlline{28\ }\hlstd{}\\
126 \hlline{29\ }\hlkwb{void\ }\hlstd{}\hlkwd{mat\textunderscore identity}\hlstd{}\hlsym{(}\hlstd{Mat}\hlsym{\&\ }\hlstd{mt}\hlsym{)\ \{}\\
127 \hlline{30\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwb{const\ int\ }\hlstd{n\ }\hlsym{=\ }\hlstd{mt}\hlsym{.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{();}\\
128 \hlline{31\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwd{assert}\hlstd{}\hlsym{(}\hlstd{n\ }\hlsym{==\ }\hlstd{mt}\hlsym{{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{());}\\
129 \hlline{32\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{i}\hlsym{,\ }\hlstd{n}\hlsym{)\ }\hlstd{}\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{j}\hlsym{,\ }\hlstd{n}\hlsym{)\ \{}\\
130 \hlline{33\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{mt}\hlsym{{[}}\hlstd{i}\hlsym{{]}{[}}\hlstd{j}\hlsym{{]}\ =\ }\hlstd{i\ }\hlsym{==\ }\hlstd{j}\hlsym{;}\\
131 \hlline{34\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlsym{\}}\\
132 \hlline{35\ }\hlstd{}\hlsym{\}}\\
133 \hlline{36\ }\hlstd{}\\
134 \hlline{37\ }\hlkwb{void\ }\hlstd{}\hlkwd{mat\textunderscore copy}\hlstd{}\hlsym{(}\hlstd{}\hlkwb{const\ }\hlstd{Mat}\hlsym{\&\ }\hlstd{in}\hlsym{,\ }\hlstd{Mat}\hlsym{\&\ }\hlstd{out}\hlsym{)\ \{}\\
135 \hlline{38\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwb{const\ int\ }\hlstd{n\ }\hlsym{=\ }\hlstd{in}\hlsym{.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{();}\\
136 \hlline{39\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwb{const\ int\ }\hlstd{m\ }\hlsym{=\ }\hlstd{in}\hlsym{{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{();}\\
137 \hlline{40\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwd{assert}\hlstd{}\hlsym{(}\hlstd{out}\hlsym{.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{()\ ==\ }\hlstd{in}\hlsym{.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{()\ \&\&\ }\hlstd{out}\hlsym{{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{()\ ==\ }\hlstd{in}\hlsym{{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{());}\\
138 \hlline{41\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{i}\hlsym{,\ }\hlstd{n}\hlsym{)\ }\hlstd{}\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{j}\hlsym{,\ }\hlstd{m}\hlsym{)\ }\hlstd{out}\hlsym{{[}}\hlstd{i}\hlsym{{]}{[}}\hlstd{j}\hlsym{{]}\ =\ }\hlstd{in}\hlsym{{[}}\hlstd{i}\hlsym{{]}{[}}\hlstd{j}\hlsym{{]};}\\
139 \hlline{42\ }\hlstd{}\hlsym{\}}\\
140 \hlline{43\ }\hlstd{}\\
141 \hlline{44\ }\hlkwb{void\ }\hlstd{}\hlkwd{mat\textunderscore pow}\hlstd{}\hlsym{(}\hlstd{}\hlkwb{const\ }\hlstd{Mat}\hlsym{\&\ }\hlstd{mt}\hlsym{,\ }\hlstd{}\hlkwb{int\ }\hlstd{pow}\hlsym{,\ }\hlstd{Mat}\hlsym{\&\ }\hlstd{res}\hlsym{)\ \{}\\
142 \hlline{45\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwb{const\ int\ }\hlstd{n\ }\hlsym{=\ }\hlstd{mt}\hlsym{.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{();}\\
143 \hlline{46\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{vector}\hlsym{$<$}\hlstd{Mat}\hlsym{$>$\ }\hlstd{}\hlkwd{acc}\hlstd{}\hlsym{(}\hlstd{}\hlnum{2}\hlstd{}\hlsym{,\ }\hlstd{}\hlkwd{Mat}\hlstd{}\hlsym{(}\hlstd{n}\hlsym{,\ }\hlstd{}\hlkwd{Row}\hlstd{}\hlsym{(}\hlstd{n}\hlsym{,\ }\hlstd{}\hlnum{0}\hlstd{}\hlsym{)));}\\
144 \hlline{47\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwd{mat\textunderscore identity}\hlstd{}\hlsym{(}\hlstd{res}\hlsym{);}\\
145 \hlline{48\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwd{mat\textunderscore copy}\hlstd{}\hlsym{(}\hlstd{mt}\hlsym{,\ }\hlstd{acc}\hlsym{{[}}\hlstd{}\hlkwa{false}\hlstd{}\hlsym{{]});}\\
146 \hlline{49\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwb{bool\ }\hlstd{cur\ }\hlsym{=\ }\hlstd{}\hlkwa{false}\hlstd{}\hlsym{;}\\
147 \hlline{50\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwa{for\ }\hlstd{}\hlsym{(;;)\ \{}\\
148 \hlline{51\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{pow\ }\hlsym{\&\ }\hlstd{}\hlnum{1}\hlstd{}\hlsym{)\ \{}\\
149 \hlline{52\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{mat\textunderscore copy}\hlstd{}\hlsym{(}\hlstd{res}\hlsym{,\ }\hlstd{acc}\hlsym{{[}!}\hlstd{cur}\hlsym{{]});}\\
150 \hlline{53\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{mat\textunderscore mult}\hlstd{}\hlsym{(}\hlstd{acc}\hlsym{{[}!}\hlstd{cur}\hlsym{{]},\ }\hlstd{acc}\hlsym{{[}}\hlstd{cur}\hlsym{{]},\ }\hlstd{res}\hlsym{);}\\
151 \hlline{54\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlsym{\}}\\
152 \hlline{55\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{pow\ }\hlsym{$>$$>$=\ }\hlstd{}\hlnum{1}\hlstd{}\hlsym{;}\\
153 \hlline{56\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{pow\ }\hlsym{==\ }\hlstd{}\hlnum{0}\hlstd{}\hlsym{)\ }\hlstd{}\hlkwa{break}\hlstd{}\hlsym{;}\\
154 \hlline{57\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{mat\textunderscore mult}\hlstd{}\hlsym{(}\hlstd{acc}\hlsym{{[}}\hlstd{cur}\hlsym{{]},\ }\hlstd{acc}\hlsym{{[}}\hlstd{cur}\hlsym{{]},\ }\hlstd{acc}\hlsym{{[}!}\hlstd{cur}\hlsym{{]});}\\
155 \hlline{58\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{cur\ }\hlsym{=\ !}\hlstd{cur}\hlsym{;}\\
156 \hlline{59\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlsym{\}}\\
157 \hlline{60\ }\hlstd{}\hlsym{\}}\\
158 \hlline{61\ }\hlstd{}\\
159 \hlline{62\ }\hlkwb{void\ }\hlstd{}\hlkwd{mat\textunderscore print}\hlstd{}\hlsym{(}\hlstd{}\hlkwb{const\ }\hlstd{Mat}\hlsym{\&\ }\hlstd{mt}\hlsym{)\ \{}\\
160 \hlline{63\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwb{const\ int\ }\hlstd{n\ }\hlsym{=\ }\hlstd{mt}\hlsym{.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{();}\\
161 \hlline{64\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwb{const\ int\ }\hlstd{m\ }\hlsym{=\ }\hlstd{mt}\hlsym{{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{();}\\
162 \hlline{65\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{i}\hlsym{,\ }\hlstd{n}\hlsym{)\ \{}\\
163 \hlline{66\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{j}\hlsym{,\ }\hlstd{m}\hlsym{)\ \{}\\
164 \hlline{67\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{cout\ }\hlsym{$<$$<$\ }\hlstd{mt}\hlsym{{[}}\hlstd{i}\hlsym{{]}{[}}\hlstd{j}\hlsym{{]}\ $<$$<$\ }\hlstd{}\hlstr{"\ "}\hlstd{}\hlsym{;}\\
165 \hlline{68\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlsym{\}}\\
166 \hlline{69\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{cout\ }\hlsym{$<$$<$\ }\hlstd{endl}\hlsym{;}\\
167 \hlline{70\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlsym{\}}\\
168 \hlline{71\ }\hlstd{}\hlsym{\}}\\
169 \hlline{72\ }\hlstd{}\\
170 \hlline{73\ }\hldir{\#define\ MIN\textunderscore CHAR\ 32}\\
171 \hlline{74\ }\hlstd{}\hldir{\#define\ MAX\textunderscore CHAR\ 127}\\
172 \hlline{75\ }\hlstd{}\hldir{\#define\ N}\hlstd{\ \ }\hldir{(MAX\textunderscore CHAR\ {-}\ MIN\textunderscore CHAR\ +\ 1)}\\
173 \hlline{76\ }\hlstd{}\\
174 \hlline{77\ }\hldir{\#define\ in\textunderscore range(Char)\ (MIN\textunderscore CHAR\ $<$=\ (Char)\ $<$=\ MAX\textunderscore CHAR)}\\
175 \hlline{78\ }\hlstd{}\hldir{\#define\ charcode(Char)\ ((Char)\ {-}\ MIN\textunderscore CHAR)}\\
176 \hlline{79\ }\hlstd{}\\
177 \hlline{80\ }\hldir{\#define\ Max\textunderscore rule\ 1024}\\
178 \hlline{81\ }\hlstd{}\hlkwb{int\ }\hlstd{}\hlkwd{main}\hlstd{}\hlsym{()\ \{}\\
179 \hlline{82\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwb{int\ }\hlstd{ncases}\hlsym{;}\\
180 \hlline{83\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwb{char\ }\hlstd{buf}\hlsym{{[}}\hlstd{Max\textunderscore rule}\hlsym{{]};}\\
181 \hlline{84\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwb{char\ }\hlstd{chr}\hlsym{;}\\
182 \hlline{85\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwd{scanf}\hlstd{}\hlsym{(}\hlstd{}\hlstr{"\%u}\hlesc{$\backslash$n}\hlstr{"}\hlstd{}\hlsym{,\ \&}\hlstd{ncases}\hlsym{);}\\
183 \hlline{86\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{ci}\hlsym{,\ }\hlstd{ncases}\hlsym{)\ \{}\\
184 \hlline{87\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwb{int\ }\hlstd{nrules}\hlsym{;}\\
185 \hlline{88\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{scanf}\hlstd{}\hlsym{(}\hlstd{}\hlstr{"\%u}\hlesc{$\backslash$n}\hlstr{"}\hlstd{}\hlsym{,\ \&}\hlstd{nrules}\hlsym{);}\\
186 \hlline{89\ }\hlstd{\\
187 \hlline{90\ }}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlslc{//\ rules{[}i{]}{[}j{]}\ =\ cantidad\ de\ ocurrencias\ de\ Ai\ en\ la\ regla\ Aj\ {-}$>$\ ...}\\
188 \hlline{91\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{Mat\ }\hlkwd{rules}\hlstd{}\hlsym{(}\hlstd{N}\hlsym{,\ }\hlstd{}\hlkwd{Row}\hlstd{}\hlsym{(}\hlstd{N}\hlsym{,\ }\hlstd{}\hlnum{0}\hlstd{}\hlsym{));}\\
189 \hlline{92\ }\hlstd{\\
190 \hlline{93\ }}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{mat\textunderscore identity}\hlstd{}\hlsym{(}\hlstd{rules}\hlsym{);}\\
191 \hlline{94\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{ri}\hlsym{,\ }\hlstd{nrules}\hlsym{)\ \{}\\
192 \hlline{95\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{scanf}\hlstd{}\hlsym{(}\hlstd{}\hlstr{"\%c{-}$>$\%s}\hlesc{$\backslash$n}\hlstr{"}\hlstd{}\hlsym{,\ \&}\hlstd{chr}\hlsym{,\ }\hlstd{buf}\hlsym{);}\\
193 \hlline{96\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{assert}\hlstd{}\hlsym{(}\hlstd{}\hlkwd{in\textunderscore range}\hlstd{}\hlsym{(}\hlstd{chr}\hlsym{));}\\
194 \hlline{97\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{i}\hlsym{,\ }\hlstd{N}\hlsym{)\ }\hlstd{rules}\hlsym{{[}}\hlstd{i}\hlsym{{]}{[}}\hlstd{}\hlkwd{charcode}\hlstd{}\hlsym{(}\hlstd{chr}\hlsym{){]}\ =\ }\hlstd{}\hlnum{0}\hlstd{}\hlsym{;}\\
195 \hlline{98\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwb{const\ int\ }\hlstd{rule\textunderscore len\ }\hlsym{=\ }\hlstd{}\hlkwd{strlen}\hlstd{}\hlsym{(}\hlstd{buf}\hlsym{);}\\
196 \hlline{99\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{i}\hlsym{,\ }\hlstd{rule\textunderscore len}\hlsym{)\ \{}\\
197 \hlline{100\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{assert}\hlstd{}\hlsym{(}\hlstd{}\hlkwd{in\textunderscore range}\hlstd{}\hlsym{(}\hlstd{buf}\hlsym{{[}}\hlstd{i}\hlsym{{]}));}\\
198 \hlline{101\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{rules}\hlsym{{[}}\hlstd{}\hlkwd{charcode}\hlstd{}\hlsym{(}\hlstd{buf}\hlsym{{[}}\hlstd{i}\hlsym{{]}){]}{[}}\hlstd{}\hlkwd{charcode}\hlstd{}\hlsym{(}\hlstd{chr}\hlsym{){]}++;}\\
199 \hlline{102\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlsym{\}}\\
200 \hlline{103\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlsym{\}}\\
201 \hlline{104\ }\hlstd{\\
202 \hlline{105\ }}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwb{int\ }\hlstd{nqueries}\hlsym{;}\\
203 \hlline{106\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwb{int\ }\hlstd{pow}\hlsym{;}\\
204 \hlline{107\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{scanf}\hlstd{}\hlsym{(}\hlstd{}\hlstr{"\%u}\hlesc{$\backslash$n}\hlstr{"}\hlstd{}\hlsym{,\ \&}\hlstd{nqueries}\hlsym{);}\\
205 \hlline{108\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{qi}\hlsym{,\ }\hlstd{nqueries}\hlsym{)\ \{}\\
206 \hlline{109\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{Mat\ }\hlkwd{input}\hlstd{}\hlsym{(}\hlstd{N}\hlsym{,\ }\hlstd{}\hlkwd{Row}\hlstd{}\hlsym{(}\hlstd{}\hlnum{1}\hlstd{}\hlsym{,\ }\hlstd{}\hlnum{0}\hlstd{}\hlsym{));}\\
207 \hlline{110\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{scanf}\hlstd{}\hlsym{(}\hlstd{}\hlstr{"\%s\ \%c\ \%u}\hlesc{$\backslash$n}\hlstr{"}\hlstd{}\hlsym{,\ }\hlstd{buf}\hlsym{,\ \&}\hlstd{chr}\hlsym{,\ \&}\hlstd{pow}\hlsym{);}\\
208 \hlline{111\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlslc{//\ procesar\ regla}\\
209 \hlline{112\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwb{const\ int\ }\hlstd{input\textunderscore len\ }\hlsym{=\ }\hlstd{}\hlkwd{strlen}\hlstd{}\hlsym{(}\hlstd{buf}\hlsym{);}\\
210 \hlline{113\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{i}\hlsym{,\ }\hlstd{input\textunderscore len}\hlsym{)\ \{}\\
211 \hlline{114\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{assert}\hlstd{}\hlsym{(}\hlstd{}\hlkwd{in\textunderscore range}\hlstd{}\hlsym{(}\hlstd{buf}\hlsym{{[}}\hlstd{i}\hlsym{{]}));}\\
212 \hlline{115\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{input}\hlsym{{[}}\hlstd{}\hlkwd{charcode}\hlstd{}\hlsym{(}\hlstd{buf}\hlsym{{[}}\hlstd{i}\hlsym{{]}){]}{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}++;}\\
213 \hlline{116\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlsym{\}}\\
214 \hlline{117\ }\hlstd{\\
215 \hlline{118\ }}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{Mat\ }\hlkwd{pow\textunderscore rules}\hlstd{}\hlsym{(}\hlstd{N}\hlsym{,\ }\hlstd{}\hlkwd{Row}\hlstd{}\hlsym{(}\hlstd{N}\hlsym{,\ }\hlstd{}\hlnum{0}\hlstd{}\hlsym{));}\\
216 \hlline{119\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{mat\textunderscore pow}\hlstd{}\hlsym{(}\hlstd{rules}\hlsym{,\ }\hlstd{pow}\hlsym{,\ }\hlstd{pow\textunderscore rules}\hlsym{);}\\
217 \hlline{120\ }\hlstd{\\
218 \hlline{121\ }}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{Mat\ }\hlkwd{result}\hlstd{}\hlsym{(}\hlstd{N}\hlsym{,\ }\hlstd{}\hlkwd{Row}\hlstd{}\hlsym{(}\hlstd{}\hlnum{1}\hlstd{}\hlsym{,\ }\hlstd{}\hlnum{0}\hlstd{}\hlsym{));}\\
219 \hlline{122\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{}\hlkwd{mat\textunderscore mult}\hlstd{}\hlsym{(}\hlstd{pow\textunderscore rules}\hlsym{,\ }\hlstd{input}\hlsym{,\ }\hlstd{result}\hlsym{);}\\
220 \hlline{123\ }\hlstd{\\
221 \hlline{124\ }}\hlstd{\ \ \ \ \ \ \ \ \ \ \ \ }\hlstd{cout\ }\hlsym{$<$$<$\ }\hlstd{result}\hlsym{{[}}\hlstd{}\hlkwd{charcode}\hlstd{}\hlsym{(}\hlstd{chr}\hlsym{){]}{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}\ $<$$<$\ }\hlstd{endl}\hlsym{;}\\
222 \hlline{125\ }\hlstd{}\hlstd{\ \ \ \ \ \ \ \ }\hlstd{}\hlsym{\}}\\
223 \hlline{126\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlsym{\}}\\
224 \hlline{127\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwa{return\ }\hlstd{}\hlnum{0}\hlstd{}\hlsym{;}\\
225 \hlline{128\ }\hlstd{}\hlsym{\}}\hlstd{}\\
226 \mbox{}
227 \normalfont
228 \shorthandon{"}